package com.example.demo.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.net.UnknownHostException;

@Configuration
public class RedisConfig {
    //编写自己的配置类
   @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
        throws UnknownHostException{
       //我们为了开发方便，一般使用<String,Object>
       RedisTemplate<String,Object>template=new RedisTemplate<>();
       template.setConnectionFactory(redisConnectionFactory);
       //json序列化，将object都转成json
       Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class);
       ObjectMapper om=new ObjectMapper();
       om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
       om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
       jackson2JsonRedisSerializer.setObjectMapper(om);
       //string序列化
       StringRedisSerializer stringRedisSerializer=new StringRedisSerializer();

       //key采用string的序列化方式
       template.setKeySerializer(stringRedisSerializer);
       //hash的key也采用string的序列化方式
       template.setHashKeySerializer(stringRedisSerializer);
       //value的序列化采用jackson
       template.setValueSerializer(jackson2JsonRedisSerializer);
       //hash的value采用jackson序列化
       template.setHashValueSerializer(jackson2JsonRedisSerializer);

       template.afterPropertiesSet();

       return template;

   }
}
